#ifndef COLAPRIORIDADHEAPS_H
#define COLAPRIORIDADHEAPS_H

#include "ColaPrioridad.h"
#include "Puntero.h"
//#include "Prioridad.h"
#include "Tabla.h"
#include "TablaHash.h"
#include "Constantes.h"
//#define MAX_ARREGLO 100
//#define MENOS_INFINITO -842150451

int fHash(const int& clave, int tam);

template <class T, class P>
class ColaPrioridadHeaps : public ColaPrioridad<T,P>{
protected:
	struct nodoColaP{
		T dato;
		P prioridad;

		bool operator==(const nodoColaP &nodo){
			return this == &nodo;
		}
	};

	int tamActual;
	int tope;
	Puntero<nodoColaP> *arreglo;
	Tabla<T,int> * THash;
		

public:
	ColaPrioridadHeaps();
	ColaPrioridadHeaps (int ( * funH)(const T &, int),const int tamMax);
	ColaPrioridadHeaps(const ColaPrioridadHeaps<T,P>& c);

	void Vacio(int tamMax);
    void Insertar(const T& dato, const P& prioridad);
	void Eliminar(const T& dato);
    void EliminarMax();
    T ObtenerMax();
	P ObtenerMaxRango();
    bool EsVacia();
    bool EstaLlena();
	int CantElementos();
	~ColaPrioridadHeaps();
	void Listar();
	virtual Puntero<ColaPrioridad<T,P>> Clonar() const;
	
	
private:
	void ActualizarPos(T dato, P pr, int pos);
	int HijoIzq(int pos);
	int HijoDer(int pos);
	int Padre(int pos);
	void Flotar(int pos);
	void Hundir(int pos);

};
#include "ColaPrioridadHeaps.cpp"
#endif